﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Reflection;
using ClickLand.CorporacionPlaza.AccesoDato.Contratos;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using Logger;
using MySql.Data.MySqlClient;

namespace ClickLand.CorporacionPlaza.AccesoDato.Implementacion.NHibernateMySql
{
    /// <summary> Clase que implementa IDaoVenta </summary>
    public class DaoVentaNHibernateMySql:DaoBase<Venta>,IDaoVenta
    {
        /// <summary> Metodo que consulta la lista de ventas por contrato </summary>
        /// <param name="contrato">Datos de para la busqueda</param>
        /// <param name="fechaInicio"> </param>
        /// <param name="fechaFin"> </param>
        /// <returns>Lista de ventas de un contrato</returns>
        public List<Venta> ConsultarXContrato(Contrato contrato, DateTime fechaInicio, DateTime fechaFin)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            List<Venta> listaEntidad = new List<Venta>();

            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ConsultarVentasContratos";
                comando.Connection.Open();
                comando.Parameters.AddWithValue("@IdContrato", contrato == null ? (object)DBNull.Value : contrato.Id);
                comando.Parameters.AddWithValue("@FechaInicio", fechaInicio);
                comando.Parameters.AddWithValue("@FechaFin", fechaFin);
                comando.Parameters["@IdContrato"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    var obj = new Venta();
                    obj.Id = (int)reader[0];
                    obj.Fecha = (DateTime)reader[1];
                    obj.Monto = (float)reader[2];
                    obj.Estado = (int)reader[3];
                    obj.Contrato = new Contrato { Id = (long)reader[4] };
                    obj.Contrato.Cliente = new Cliente { Id = (int)reader[5], Nombre = (string)reader[6] };
                    obj.Contrato.Establecimiento = new Establecimiento {Id = (long) reader[7], Numero = (string) reader[8]};
                    obj.Contrato.NombreComercial = (string) reader[9];
                    listaEntidad.Add(obj);

                }

                #region Instrumentacion Salida
                if (Log.InfoHabilitado)
                    Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
                #endregion
                comando.Connection.Close();
                return listaEntidad;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }
    }
}
